package FileTest.Homework;

import java.io.*;
import java.util.Scanner;

/*
拷贝目录：
	将D:\course拷贝到C盘根下....
	需要使用到：
		FileInputStream
		FileOutputStream
		File
	可能需要使用到递归。你尝试实现一下！
 */
public class FileDirectoryCopy {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.println("请输入拷贝文件的源路径");
        String src = s.next();
        System.out.println("请输入拷贝文件的目标路径");
        String dest = s.next();
        File srcFile = new File(src);
        File destFile = new File(dest);
        fileCopy(srcFile,destFile);
    }
    /*
     * @description: 拷贝目录
    * @param srcFile
     * @param destFile
     * @return: void
     * @author: 申继旺
     * @time: 2022/10/29 23:05
     */
    public static void fileCopy(File srcFile,File destFile){
        //如果是一个文件，则调用拷贝文件方法
        if(srcFile.isFile()){
            fileStream(srcFile,destFile);
            //文件拷贝结束后，直接结束本方法
            return;
        }
        //程序走到这表示srcFile为一个目录
        //找出目录下所有文件
        File[] files = srcFile.listFiles();
        //遍历文件数组
        for(File file : files){
            if(file.isDirectory()){
                String s = file.getAbsolutePath(); //目录的绝对路径
                String s1 = destFile.getAbsolutePath(); //目标路径
                String newUrl =(s1.endsWith("\\") ? s1 : s1+"\\") + s.substring(3); //将目录绝对路径的头(D:\\)截取，拼接在目标路径之后
                File file1 = new File(newUrl); //创建一个文件对象
                if(!(file1.exists())){
                    //创建目录
                    file1.mkdirs();
                }
            }
            //递归执行本方法
            fileCopy(file,destFile);
        }
    }

    /*
     * @description:拷贝文件
    * @param srcFile
     * @param destFile
     * @return: void
     * @author: 申继旺
     * @time: 2022/10/29 23:06
     */
    public static void fileStream(File srcFile,File destFile) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            String url = srcFile.getAbsolutePath(); //要拷贝的文件的绝对路径
            fis = new FileInputStream(url); //读取要拷贝的文件
            String s = destFile.getAbsolutePath(); //目标路径
            String newUrl = (s.endsWith("\\") ? s : s + "\\") + url.substring(3); //将文件绝对路径的头(D:\\)截取，拼接在目标路径之后
            System.out.println(newUrl);
            fos = new FileOutputStream(newUrl,true);
            //创建一个byte数组，作为数据缓冲区
            byte[] bytes = new byte[1024*1024];
            int readCount = 0;
            while((readCount = fis.read(bytes)) != -1){
                fos.write(bytes,0,readCount);
            }
            //刷新文件管道
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
